package br.ufal.ic.core;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;

/**
 * Entidade que contem dados de um torneio criado.
 * 
 * @author Marcos Paulo
 */
@Entity
public class TournamentInformation implements Serializable {

    /**
     * Nome do torneio criado.
     */
    @Id
    private String name;
    /**
     * Tipo de torneio que foi criado.
     */
    @Enumerated(EnumType.ORDINAL)
    private TournamentType type;
    /**
     * Data de criação do torneio.
     */
    @Temporal(TemporalType.DATE)
    private Date creationDate;
    /**
     * Quantidades de dias a parti da data de criação para começar o torneio.
     */
    private int dayToStart;
    /**
     * Quantidades de dias que o torneio dura.
     */
    private int daysDuration;

    protected TournamentInformation() {
        //for hibernate.
    }

    public TournamentInformation(String name, TournamentType type,
            Date creationDate) {

        if (name == null || name.equalsIgnoreCase("")) {
            throw new IllegalArgumentException("o nome não pode ser nulo");
        }

        if (type == null) {
            throw new IllegalArgumentException("informe o tipo de torneio");
        }

        if (creationDate == null) {
            throw new IllegalArgumentException("informe a data de criação");
        }

        this.name = name;
        this.type = type;
        this.creationDate = creationDate;
        //valor default sera 100.
        setDaysToStart(100);
        //valor default sera 5.
        setDaysDuration(5);
    }

    public TournamentInformation(String name, TournamentType type,
            Date creationDate, int daysToStart) {

        this(name, type, creationDate);
        setDaysToStart(daysToStart);
    }

    public TournamentInformation(String name, TournamentType type,
            Date creationDate, int daysToStart, int daysDuration) {

        this(name, type, creationDate, daysToStart);
        setDaysDuration(daysDuration);
    }

    /**
     *
     * @return o nome do torneio.
     */
    public String getName() {
        return name;
    }

    /**
     *
     * @return tipo de torneio.
     */
    public TournamentType getType() {
        return type;
    }

    /**
     *
     * @return data de criação.
     */
    public Date getCreationDate() {
        return creationDate;
    }

    /**
     *
     * @param dias faltando para começar o torneio a parti da data de criação.
     */
    public void setDaysToStart(int daysToStart) {
        if (daysToStart < 0) {
            throw new IllegalArgumentException("dias para começar o torneio não"
                    + " pode ser negativo.");
        }
        this.dayToStart = daysToStart;
    }

    /**
     *
     * @return dias a parti da data de criação para começar o torneio.
     */
    public int getDaysToStart() {
        return dayToStart;
    }

    /**
     * 
     * @param quantidade de dias que o torneio vai durar.
     */
    public void setDaysDuration(int daysDuration) {
        if (daysDuration < 0) {
            throw new IllegalArgumentException("quantidade de dias que o "
                    + "torneio vai durar não pode ser negativo.");
        }

        this.daysDuration = daysDuration;
    }

    /**
     * 
     * @return dias que o torneio vai durar.
     */
    public int getDaysDuration() {
        return daysDuration;
    }

    @Override
    public boolean equals(Object obj) {

        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }

        TournamentInformation other = (TournamentInformation) obj;

        return this.name.equals(other.name);
    }

    @Override
    public int hashCode() {
        return 23 * 7 + this.name.hashCode();
    }
}
